package com.example.printservice.exeception;

import com.example.printservice.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;

/**
 * 集中处理所有异常
 */
//@ResponseBody   //由于我们要将返回的出去的数据以JSON的格式返回出去 就要使用这种方式
//@ControllerAdvice(basePackages = "com/xc/gulimallproduct/controller")  //使用注解进行设置 并标注我们的那些类要进行校验
//    使用这个注解包含了上面的两个注解
//@RestControllerAdvice(basePackages = "com.example.printservice.controller")  //使用注解进行设置 并标注我们的那些类要进行校验
@Slf4j
public class GulimallExceptionControllerAdvice {


    @ExceptionHandler(value = MethodArgumentNotValidException.class) //使用Exception 表示所有异常都能处理  但是这里我们只处理校验异常 MethodArgumentNotValidException
    public R handleVaildException(MethodArgumentNotValidException e)
    {
        BindingResult bindingResult = e.getBindingResult();
        HashMap<String, String> map = new HashMap<>();
        bindingResult.getFieldErrors().forEach((fieldError)->
        {
//            获取所有的异常错误保存到集合中
            map.put(fieldError.getField(),fieldError.getDefaultMessage());
        });
        log.error(String.valueOf(map));  //后端输出
        return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(), BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",map); //前端返回状态
    }

//    这是一个统一大的异常校验处理
    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable e)
    {

        String message = e.getMessage();
        log.error(message);
        return R.error(BizCodeEnume.FILENAME_EXCEPTION.getCode(), BizCodeEnume.FILENAME_EXCEPTION.getMsg()).put("data",message);
    }
}
